/*
 * @Descripttion: 
 * @version: 
 * @Author: wtzhang
 * @Date: 2021-07-07 14:21:24
 * @LastEditors: wtzhang
 * @LastEditTime: 2021-07-07 15:50:35
 */
(function () {
  console.log('******************* 属性的封装 **********************');
/**
 * public 公有属性，修饰的属性可以在任意位置访问（修改）
 * private 私有属性，修饰的属性只能在类的内部进行访问（修改）
 *    - 通过在类中添加方法使得私有属性可以被外面访问，如下面 getName,setName用来获取name的方法
 */
//   class Person {
//     private name: string;
//     private age: number;
//     constructor(name: string, age: number) {
//       this.name = name;
//       this.age = age;
//     }
//     // 定义方法getter，用来获取name属性
//     getName() {
//       return this.name
//     }
//     // 定义方法setter， 用来设置name属性
//     setName(value:string) {
//       this.name = value
//     }
//     // 定义方法setter，用来设置年龄属性
//     setAge(value: number) {
//       if (value >= 0) {
//         this.age = value
//       }
//     }
//   }
//   const per = new Person('jack', 18)
//   console.log('原数据：', per);
//   /**
//    * 现在属性是在对象中设置的，属性可以任意被修改
//    * 属性可以任意被修改会导致对象中的数据变得很不安全
//    */
//   // ////////// 由于属性为私有属性，无法直接修改，否则报错无法编译 /////////////
//   // per.name = 'rose'
//   // per.age = -21
//   // //////////////////////
//   console.log('通过getName()方法，获取name属性', per.getName()); // 获取name属性
//   per.setName('猪八戒')
//   console.log('现数据：', per);
// })()

class Person {
  private _name: string;
  private _age: number;
  constructor(_name: string, _age: number) {
    this._name = _name;
    this._age = _age;
  }
  // 在ts中设置 getter，setter方法的方式
  get name() {
    return this._name
  }
  set name(value:string) {
    this._name = value;
  }
}
const per = new Person('jack', 18)
console.log('原数据：', per);
console.log('per.name可直接获取name属性', per.name);
per.name = '猪八戒'
console.log('现数据：', per);
})()

// (function () {
//   class Person {
//     protected name: string;
//     protected age: number;

//     constructor(name: string, age: number) {
//       this.name = name; // 可以修改
//       this.age = age;
//     }

//     sayHello() {
//       console.log(`大家好，我是${this.name}`);
//     }
//   }

//   class Employee extends Person {

//     constructor(name: string, age: number) {
//       super(name, age);
//       this.name = name; //子类中可以修改
//     }
//   }

//   const p = new Person('孙悟空', 18);
//   // p.name = '猪八戒';// 不能修改
//   const e = new Employee('猪八戒', 19)
//   console.log(e);
//   e.name = 'jack' // 不能修改
// })()